home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 November / PCWorld_2006-11_cd.bin / domacnost a kancelar / findgraph / fgraph.exe / {app} / UserModels / UserModels.cpp < prev    next >
C/C++ Source or Header  |  2004-10-06  |  6KB  |  216 lines

  1. // UserModels.cpp : Defines the entry point for the USERMODELS.DLL application.
  2. //
  3. //
  4. /******************************************************************************
  5.  * 'User model' Plug-In DLL
  6.  * for use with C/C++
  7.  * 
  8.  * How do I include my equations or curve fitting model?
  9.  * To include your equations into FindGraph with a 'user model' plugin 
  10.  * follow these steps:
  11.  * 1. Open this project UserModels.dsp;
  12.  * 2. Open files Models.cpp and Models.h;
  13.  * 3. Select any name of your model. For example, "MyEquation";
  14.  * 4. Add string DEFINE_MODEL(MyEquation) in Models.h;
  15.  * 5. Add string MODELS_LIST_ADD(id, MyEquation) in Models.cpp;
  16.  *    Replace id with unical number less 999, for example '101'.
  17.  * 6. Prepare functions:    
  18.  *      MyEquation_Name 
  19.  *      MyEquation_Form 
  20.  *      MyEquation_Calc 
  21.  *      MyEquation_Check
  22.  *      MyEquation_Defau
  23.  *    Use functions Poly_Name, Poly_Form, Poly_Calc, Poly_Check, Poly_Defau         
  24.  *    in Models.cpp as template.
  25.  * 7. Compile this USERMODELS.DLL
  26.  * 8. Place it in  the program FindGraph subfolder "Models".
  27.  * 
  28.  * To test DLL: 
  29.  * 1. Restart FundGraph;
  30.  * 2. Start The Wizard of approximation;
  31.  * 3. On step 2 choose function 'Non-linear';
  32.  * 4. On step 3 select family 'User Models'.
  33.  * If all right, on step 3 your function will appear in functions list.
  34.  * 
  35.  * Alternatively, if you're unaccustomed to writing DLL's 
  36.  * we'd be happy to produce a plugin for licensed users at no charge, 
  37.  * provided that you can furnish the curve fitting model details:
  38.  * 1. Model Title.
  39.  * 2. Equation of function in form Y = f(X,a,b,c,d,g,h,k,l,m).
  40.  * 3. Default parameters (a,b,c,d,g,h,k,l,m) values.
  41.  * 
  42.  * Contact us for more information. E-mail: serg@uniphiz.com 
  43.  * 
  44.  ******************************************************************************/
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53. //--------------------------------------------------------------------------------------
  54.  
  55. #include "stdafx.h"
  56. #include <tchar.h>
  57. #include "models.h"
  58.  
  59. HINSTANCE g_hInstance=NULL;
  60.  
  61. BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
  62. {
  63.     switch (ul_reason_for_call)
  64.     {
  65.         case DLL_PROCESS_ATTACH:
  66.              g_hInstance = (HINSTANCE )hModule;
  67.              break;
  68.         case DLL_PROCESS_DETACH:
  69.              break;
  70.     }
  71.      return TRUE;
  72. }
  73.  
  74. ////////////////////////////////////////////////////////////////////////////////////////////////
  75. // All function return 1 if result
  76. //
  77.  
  78. //Group Name
  79. // nIdList Unused
  80. //
  81. __declspec(dllexport) int FunctionGroupDesc(int nIdList, LPTSTR lpszInfo, int nLen)
  82. {
  83.     if (lpszInfo==NULL) return -1;
  84.     lstrcpyn(lpszInfo, _T("User Models"), nLen);
  85.     return 1;
  86. }
  87.  
  88.  
  89. // nIdList Unused
  90. // 
  91. __declspec(dllexport) int FunctionGroupList(int nIdList, int *pnIds, int *pNumber)
  92. {
  93.     if (pnIds==NULL) return -1;
  94.     if (FittingModelsList(nIdList, pnIds, pNumber))
  95.         return 1;
  96.     return 0;
  97. }
  98.  
  99.  
  100. // Fill lpszName with 'Model name'
  101. // Example: "Linear"
  102. //
  103. __declspec(dllexport) int FunctionName(int nIdFunc, LPTSTR lpszName, int nLen)
  104. {
  105.     if (lpszName==NULL) return -1;
  106.     FuncDesc *pDesc = PFittingDescInId(nIdFunc);
  107.     if (NULL != pDesc  &&  NULL != pDesc->m_pFuncName) 
  108.     {
  109.         pDesc->m_pFuncName(lpszName, nLen);
  110.         return 1;
  111.     }
  112.     return 0;
  113. }
  114.  
  115. // Fill lpszForm with 'Formula'
  116. // Example: "aa*x+bb"
  117. // Important: replace all symbols a,b,c,... with aa,bb,cc...
  118. // nIdEquation Unused
  119. //
  120. __declspec(dllexport) int FunctionForm(int nIdFunc, int nIdEquation, LPTSTR lpszForm, int nLen)
  121. {
  122.     if (lpszForm==NULL) return -1;
  123.     FuncDesc *pDesc = PFittingDescInId(nIdFunc);
  124.     if (NULL != pDesc  &&  NULL != pDesc->m_pFuncForm) 
  125.     {
  126.         pDesc->m_pFuncForm(lpszForm, nLen);
  127.         return 1;
  128.     }
  129.     return 0;
  130. }
  131.  
  132.  
  133.  
  134. // nIdEquation  - parameter Unused
  135. //
  136. PToFuncCalc PFunctionInIdCalc(int nIdFunc, int nIdEquation)
  137. {
  138.     FuncDesc *pDesc = PFittingDescInId(nIdFunc);
  139.     return (NULL != pDesc ) ?pDesc->m_pFuncCalc :NULL;
  140. }
  141.  
  142.  
  143.  
  144. // nIdEquation  - parameter Unused
  145. //
  146. __declspec(dllexport) int FunctionCalc(int nIdFunc, int nIdEquation, double *pfParams, int nParams, double u, double *x, double *y)
  147. {
  148.     PToFuncCalc pFuncCalc = PFunctionInIdCalc(nIdFunc, nIdEquation);
  149.     if (pFuncCalc != NULL)
  150.         return pFuncCalc(pfParams, nParams, u, x, y);
  151.     *x = u; *y = 0.;
  152.     return -1;
  153. }
  154.  
  155. // nIdEquation  - parameter Unused
  156. //
  157. __declspec(dllexport) int FunctionFunc(int nIdFunc, int nIdEquation, long *pFunction)
  158. {
  159.     PToFuncCalc pFuncCalc = PFunctionInIdCalc(nIdFunc, nIdEquation);
  160.     pFunction = (long *)pFuncCalc;
  161.     if (pFuncCalc != NULL)    return 1;
  162.     return -1;
  163. }    
  164.  
  165.  
  166. // Unused
  167. //
  168. __declspec(dllexport) int FunctionPict(int nIdFunc, int nIdEquation)
  169. {
  170.     return 0;
  171. }    
  172.  
  173.  
  174. // return the number of parameters actually used
  175. // set other parameters to 0
  176. //
  177. __declspec(dllexport) int FunctionCheck(int nIdFunc, int nIdEquation, double *pfParams, int nParams)
  178. {
  179.     FuncDesc *pDesc = PFittingDescInId(nIdFunc);
  180.     if (NULL != pDesc  &&  NULL != pDesc->m_pFuncCheck) 
  181.     {
  182.         return pDesc->m_pFuncCheck(pfParams, nParams);
  183.     }
  184.     return -1;
  185. }
  186.  
  187.  
  188.  
  189. // Fill pfParams with default values
  190. // to start fitting
  191. // px[4]: xMin, xMax, xMed, x(yMed)
  192. // py[4]: yMin, yMax, yMed, y(xMed)
  193. //
  194. __declspec(dllexport) int FunctionDefaupa(int nIdFunc,
  195.                                         BOOL bNormed, double *px, double *py,
  196.                                         double *pfParams, int nParams)
  197. {
  198.     FuncDesc *pDesc = PFittingDescInId(nIdFunc);
  199.     if (NULL != pDesc  &&  NULL != pDesc->m_pFuncDefau) 
  200.     {
  201.         if (NULL==px || NULL==py)
  202.             bNormed = TRUE;
  203.         return pDesc->m_pFuncDefau(pfParams, nParams, px, py, bNormed);
  204.     }
  205.     return -1;
  206. }
  207.  
  208.  
  209. // Fill pfParams with default Normed values
  210. // to start fitting
  211. //
  212. __declspec(dllexport) int FunctionDefault(int nIdFunc, double *pfParams, int nParams)
  213. {
  214.     return FunctionDefaupa(nIdFunc, TRUE, NULL, NULL, pfParams, nParams);
  215. }
  216.